/*
 * Copyright (c) 2024 Beijing HuaQingYuanJian Education Technology Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "stdio.h"
#include "pinctrl.h"
#include "gpio.h"
#include "i2c.h"
#include "hal_bsp_ssd1306.h"
#include "osal_task.h"
/* io */
#define I2C_SCL_MASTER_PIN 16
#define I2C_SDA_MASTER_PIN 15
#define CONFIG_PIN_MODE 2

#define RESET_TIME 10            // 100ms
#define TEXT_SIZE_8_WIDTH_6 6    // 字体大小  8：6*8
#define TEXT_SIZE_8_HIGHT_8 8    // 字体大小  8：6*8
#define TEXT_SIZE_16_WIDTH_8 8   // 字体大小  16：8*16
#define TEXT_SIZE_16_HIGHT_16 16 // 字体大小  16：8*16
#define TEXT_8_MAX_ROW_POS 126
#define TEXT_16_MAX_ROW_POS 120
#define OFFSET_2 2
#define OFFSET_8 8
#define OFFSET_16 16

/************************************6*8的点阵************************************/
const unsigned char F6X8[][6] = {
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // sp
    {0x00, 0x00, 0x00, 0x2f, 0x00, 0x00}, // !
    {0x00, 0x00, 0x07, 0x00, 0x07, 0x00}, // "
    {0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14}, // #
    {0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12}, // $
    {0x00, 0x62, 0x64, 0x08, 0x13, 0x23}, // %
    {0x00, 0x36, 0x49, 0x55, 0x22, 0x50}, // &
    {0x00, 0x00, 0x05, 0x03, 0x00, 0x00}, // '
    {0x00, 0x00, 0x1c, 0x22, 0x41, 0x00}, // (
    {0x00, 0x00, 0x41, 0x22, 0x1c, 0x00}, // )
    {0x00, 0x14, 0x08, 0x3E, 0x08, 0x14}, // *
    {0x00, 0x08, 0x08, 0x3E, 0x08, 0x08}, // +
    {0x00, 0x00, 0x00, 0xA0, 0x60, 0x00}, // ,
    {0x00, 0x08, 0x08, 0x08, 0x08, 0x08}, // -
    {0x00, 0x00, 0x60, 0x60, 0x00, 0x00}, // .
    {0x00, 0x20, 0x10, 0x08, 0x04, 0x02}, // /
    {0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E}, // 0
    {0x00, 0x00, 0x42, 0x7F, 0x40, 0x00}, // 1
    {0x00, 0x42, 0x61, 0x51, 0x49, 0x46}, // 2
    {0x00, 0x21, 0x41, 0x45, 0x4B, 0x31}, // 3
    {0x00, 0x18, 0x14, 0x12, 0x7F, 0x10}, // 4
    {0x00, 0x27, 0x45, 0x45, 0x45, 0x39}, // 5
    {0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30}, // 6
    {0x00, 0x01, 0x71, 0x09, 0x05, 0x03}, // 7
    {0x00, 0x36, 0x49, 0x49, 0x49, 0x36}, // 8
    {0x00, 0x06, 0x49, 0x49, 0x29, 0x1E}, // 9
    {0x00, 0x00, 0x36, 0x36, 0x00, 0x00}, // :
    {0x00, 0x00, 0x56, 0x36, 0x00, 0x00}, // ;
    {0x00, 0x08, 0x14, 0x22, 0x41, 0x00}, // <
    {0x00, 0x14, 0x14, 0x14, 0x14, 0x14}, // =
    {0x00, 0x00, 0x41, 0x22, 0x14, 0x08}, // >
    {0x00, 0x02, 0x01, 0x51, 0x09, 0x06}, // ?
    {0x00, 0x32, 0x49, 0x59, 0x51, 0x3E}, // @
    {0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C}, // A
    {0x00, 0x7F, 0x49, 0x49, 0x49, 0x36}, // B
    {0x00, 0x3E, 0x41, 0x41, 0x41, 0x22}, // C
    {0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C}, // D
    {0x00, 0x7F, 0x49, 0x49, 0x49, 0x41}, // E
    {0x00, 0x7F, 0x09, 0x09, 0x09, 0x01}, // F
    {0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A}, // G
    {0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F}, // H
    {0x00, 0x00, 0x41, 0x7F, 0x41, 0x00}, // I
    {0x00, 0x20, 0x40, 0x41, 0x3F, 0x01}, // J
    {0x00, 0x7F, 0x08, 0x14, 0x22, 0x41}, // K
    {0x00, 0x7F, 0x40, 0x40, 0x40, 0x40}, // L
    {0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F}, // M
    {0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F}, // N
    {0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E}, // O
    {0x00, 0x7F, 0x09, 0x09, 0x09, 0x06}, // P
    {0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E}, // Q
    {0x00, 0x7F, 0x09, 0x19, 0x29, 0x46}, // R
    {0x00, 0x46, 0x49, 0x49, 0x49, 0x31}, // S
    {0x00, 0x01, 0x01, 0x7F, 0x01, 0x01}, // T
    {0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F}, // U
    {0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F}, // V
    {0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F}, // W
    {0x00, 0x63, 0x14, 0x08, 0x14, 0x63}, // X
    {0x00, 0x07, 0x08, 0x70, 0x08, 0x07}, // Y
    {0x00, 0x61, 0x51, 0x49, 0x45, 0x43}, // Z
    {0x00, 0x00, 0x7F, 0x41, 0x41, 0x00}, // [
    {0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55}, // 55
    {0x00, 0x00, 0x41, 0x41, 0x7F, 0x00}, // ]
    {0x00, 0x04, 0x02, 0x01, 0x02, 0x04}, // ^
    {0x00, 0x40, 0x40, 0x40, 0x40, 0x40}, // _
    {0x00, 0x00, 0x01, 0x02, 0x04, 0x00}, // '
    {0x00, 0x20, 0x54, 0x54, 0x54, 0x78}, // a
    {0x00, 0x7F, 0x48, 0x44, 0x44, 0x38}, // b
    {0x00, 0x38, 0x44, 0x44, 0x44, 0x20}, // c
    {0x00, 0x38, 0x44, 0x44, 0x48, 0x7F}, // d
    {0x00, 0x38, 0x54, 0x54, 0x54, 0x18}, // e
    {0x00, 0x08, 0x7E, 0x09, 0x01, 0x02}, // f
    {0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C}, // g
    {0x00, 0x7F, 0x08, 0x04, 0x04, 0x78}, // h
    {0x00, 0x00, 0x44, 0x7D, 0x40, 0x00}, // i
    {0x00, 0x40, 0x80, 0x84, 0x7D, 0x00}, // j
    {0x00, 0x7F, 0x10, 0x28, 0x44, 0x00}, // k
    {0x00, 0x00, 0x41, 0x7F, 0x40, 0x00}, // l
    {0x00, 0x7C, 0x04, 0x18, 0x04, 0x78}, // m
    {0x00, 0x7C, 0x08, 0x04, 0x04, 0x78}, // n
    {0x00, 0x38, 0x44, 0x44, 0x44, 0x38}, // o
    {0x00, 0xFC, 0x24, 0x24, 0x24, 0x18}, // p
    {0x00, 0x18, 0x24, 0x24, 0x18, 0xFC}, // q
    {0x00, 0x7C, 0x08, 0x04, 0x04, 0x08}, // r
    {0x00, 0x48, 0x54, 0x54, 0x54, 0x20}, // s
    {0x00, 0x04, 0x3F, 0x44, 0x40, 0x20}, // t
    {0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C}, // u
    {0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C}, // v
    {0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C}, // w
    {0x00, 0x44, 0x28, 0x10, 0x28, 0x44}, // x
    {0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C}, // y
    {0x00, 0x44, 0x64, 0x54, 0x4C, 0x44}, // z
    {0x14, 0x14, 0x14, 0x14, 0x14, 0x14},
};
/****************************************8*16的点阵************************************/
const unsigned char F8X16[] = {
    /* 0 */
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    /* ! 1 */
    0x00,
    0x00,
    0x00,
    0xF8,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x33,
    0x30,
    0x00,
    0x00,
    0x00,
    /* " 2 */
    0x00,
    0x10,
    0x0C,
    0x06,
    0x10,
    0x0C,
    0x06,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    /* # 3 */
    0x40,
    0xC0,
    0x78,
    0x40,
    0xC0,
    0x78,
    0x40,
    0x00,
    0x04,
    0x3F,
    0x04,
    0x04,
    0x3F,
    0x04,
    0x04,
    0x00,
    /* $ 4 */
    0x00,
    0x70,
    0x88,
    0xFC,
    0x08,
    0x30,
    0x00,
    0x00,
    0x00,
    0x18,
    0x20,
    0xFF,
    0x21,
    0x1E,
    0x00,
    0x00,
    /* % 5 */
    0xF0,
    0x08,
    0xF0,
    0x00,
    0xE0,
    0x18,
    0x00,
    0x00,
    0x00,
    0x21,
    0x1C,
    0x03,
    0x1E,
    0x21,
    0x1E,
    0x00,
    /* & 6 */
    0x00,
    0xF0,
    0x08,
    0x88,
    0x70,
    0x00,
    0x00,
    0x00,
    0x1E,
    0x21,
    0x23,
    0x24,
    0x19,
    0x27,
    0x21,
    0x10,
    /* ' 7 */
    0x10,
    0x16,
    0x0E,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    /* ( 8 */
    0x00,
    0x00,
    0x00,
    0xE0,
    0x18,
    0x04,
    0x02,
    0x00,
    0x00,
    0x00,
    0x00,
    0x07,
    0x18,
    0x20,
    0x40,
    0x00,
    /* ) 9 */
    0x00,
    0x02,
    0x04,
    0x18,
    0xE0,
    0x00,
    0x00,
    0x00,
    0x00,
    0x40,
    0x20,
    0x18,
    0x07,
    0x00,
    0x00,
    0x00,
    /* * 10 */
    0x40,
    0x40,
    0x80,
    0xF0,
    0x80,
    0x40,
    0x40,
    0x00,
    0x02,
    0x02,
    0x01,
    0x0F,
    0x01,
    0x02,
    0x02,
    0x00,
    /* + 11 */
    0x00,
    0x00,
    0x00,
    0xF0,
    0x00,
    0x00,
    0x00,
    0x00,
    0x01,
    0x01,
    0x01,
    0x1F,
    0x01,
    0x01,
    0x01,
    0x00,
    /* , 12 */
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x80,
    0xB0,
    0x70,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    /* - 13 */
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x01,
    0x01,
    0x01,
    0x01,
    0x01,
    0x01,
    0x01,
    /* . 14 */
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x30,
    0x30,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    /* / 15 */
    0x00,
    0x00,
    0x00,
    0x00,
    0x80,
    0x60,
    0x18,
    0x04,
    0x00,
    0x60,
    0x18,
    0x06,
    0x01,
    0x00,
    0x00,
    0x00,
    /* 0 16 */
    0x00,
    0xE0,
    0x10,
    0x08,
    0x08,
    0x10,
    0xE0,
    0x00,
    0x00,
    0x0F,
    0x10,
    0x20,
    0x20,
    0x10,
    0x0F,
    0x00,
    /* 1 17 */
    0x00,
    0x10,
    0x10,
    0xF8,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x20,
    0x20,
    0x3F,
    0x20,
    0x20,
    0x00,
    0x00,
    /* 2 18 */
    0x00,
    0x70,
    0x08,
    0x08,
    0x08,
    0x88,
    0x70,
    0x00,
    0x00,
    0x30,
    0x28,
    0x24,
    0x22,
    0x21,
    0x30,
    0x00,
    /* 3 19 */
    0x00,
    0x30,
    0x08,
    0x88,
    0x88,
    0x48,
    0x30,
    0x00,
    0x00,
    0x18,
    0x20,
    0x20,
    0x20,
    0x11,
    0x0E,
    0x00,
    /* 4 20 */
    0x00,
    0x00,
    0xC0,
    0x20,
    0x10,
    0xF8,
    0x00,
    0x00,
    0x00,
    0x07,
    0x04,
    0x24,
    0x24,
    0x3F,
    0x24,
    0x00,
    /* 5 21 */
    0x00,
    0xF8,
    0x08,
    0x88,
    0x88,
    0x08,
    0x08,
    0x00,
    0x00,
    0x19,
    0x21,
    0x20,
    0x20,
    0x11,
    0x0E,
    0x00,
    /* 6 22 */
    0x00,
    0xE0,
    0x10,
    0x88,
    0x88,
    0x18,
    0x00,
    0x00,
    0x00,
    0x0F,
    0x11,
    0x20,
    0x20,
    0x11,
    0x0E,
    0x00,
    /* 7 23 */
    0x00,
    0x38,
    0x08,
    0x08,
    0xC8,
    0x38,
    0x08,
    0x00,
    0x00,
    0x00,
    0x00,
    0x3F,
    0x00,
    0x00,
    0x00,
    0x00,
    /* 8 24 */
    0x00,
    0x70,
    0x88,
    0x08,
    0x08,
    0x88,
    0x70,
    0x00,
    0x00,
    0x1C,
    0x22,
    0x21,
    0x21,
    0x22,
    0x1C,
    0x00,
    /* 9 25 */
    0x00,
    0xE0,
    0x10,
    0x08,
    0x08,
    0x10,
    0xE0,
    0x00,
    0x00,
    0x00,
    0x31,
    0x22,
    0x22,
    0x11,
    0x0F,
    0x00,
    /* : 26 */
    0x00,
    0x00,
    0x00,
    0xC0,
    0xC0,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x30,
    0x30,
    0x00,
    0x00,
    0x00,
    /* ; 27 */
    0x00,
    0x00,
    0x00,
    0x80,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x80,
    0x60,
    0x00,
    0x00,
    0x00,
    0x00,
    /* < 28 */
    0x00,
    0x00,
    0x80,
    0x40,
    0x20,
    0x10,
    0x08,
    0x00,
    0x00,
    0x01,
    0x02,
    0x04,
    0x08,
    0x10,
    0x20,
    0x00,
    /* = 29 */
    0x40,
    0x40,
    0x40,
    0x40,
    0x40,
    0x40,
    0x40,
    0x00,
    0x04,
    0x04,
    0x04,
    0x04,
    0x04,
    0x04,
    0x04,
    0x00,
    /* > 30 */
    0x00,
    0x08,
    0x10,
    0x20,
    0x40,
    0x80,
    0x00,
    0x00,
    0x00,
    0x20,
    0x10,
    0x08,
    0x04,
    0x02,
    0x01,
    0x00,
    /* ? 31 */
    0x00,
    0x70,
    0x48,
    0x08,
    0x08,
    0x08,
    0xF0,
    0x00,
    0x00,
    0x00,
    0x00,
    0x30,
    0x36,
    0x01,
    0x00,
    0x00,
    /* @ 32 */
    0xC0,
    0x30,
    0xC8,
    0x28,
    0xE8,
    0x10,
    0xE0,
    0x00,
    0x07,
    0x18,
    0x27,
    0x24,
    0x23,
    0x14,
    0x0B,
    0x00,
    /* A 33 */
    0x00,
    0x00,
    0xC0,
    0x38,
    0xE0,
    0x00,
    0x00,
    0x00,
    0x20,
    0x3C,
    0x23,
    0x02,
    0x02,
    0x27,
    0x38,
    0x20,
    /* B 34 */
    0x08,
    0xF8,
    0x88,
    0x88,
    0x88,
    0x70,
    0x00,
    0x00,
    0x20,
    0x3F,
    0x20,
    0x20,
    0x20,
    0x11,
    0x0E,
    0x00,
    /* C 35 */
    0xC0,
    0x30,
    0x08,
    0x08,
    0x08,
    0x08,
    0x38,
    0x00,
    0x07,
    0x18,
    0x20,
    0x20,
    0x20,
    0x10,
    0x08,
    0x00,
    /* D 36 */
    0x08,
    0xF8,
    0x08,
    0x08,
    0x08,
    0x10,
    0xE0,
    0x00,
    0x20,
    0x3F,
    0x20,
    0x20,
    0x20,
    0x10,
    0x0F,
    0x00,
    /* E 37 */
    0x08,
    0xF8,
    0x88,
    0x88,
    0xE8,
    0x08,
    0x10,
    0x00,
    0x20,
    0x3F,
    0x20,
    0x20,
    0x23,
    0x20,
    0x18,
    0x00,
    /* F 38 */
    0x08,
    0xF8,
    0x88,
    0x88,
    0xE8,
    0x08,
    0x10,
    0x00,
    0x20,
    0x3F,
    0x20,
    0x00,
    0x03,
    0x00,
    0x00,
    0x00,
    /* G 39 */
    0xC0,
    0x30,
    0x08,
    0x08,
    0x08,
    0x38,
    0x00,
    0x00,
    0x07,
    0x18,
    0x20,
    0x20,
    0x22,
    0x1E,
    0x02,
    0x00,
    /* H 40 */
    0x08,
    0xF8,
    0x08,
    0x00,
    0x00,
    0x08,
    0xF8,
    0x08,
    0x20,
    0x3F,
    0x21,
    0x01,
    0x01,
    0x21,
    0x3F,
    0x20,
    /* I 41 */
    0x00,
    0x08,
    0x08,
    0xF8,
    0x08,
    0x08,
    0x00,
    0x00,
    0x00,
    0x20,
    0x20,
    0x3F,
    0x20,
    0x20,
    0x00,
    0x00,
    /* J 42 */
    0x00,
    0x00,
    0x08,
    0x08,
    0xF8,
    0x08,
    0x08,
    0x00,
    0xC0,
    0x80,
    0x80,
    0x80,
    0x7F,
    0x00,
    0x00,
    0x00,
    /* K 43 */
    0x08,
    0xF8,
    0x88,
    0xC0,
    0x28,
    0x18,
    0x08,
    0x00,
    0x20,
    0x3F,
    0x20,
    0x01,
    0x26,
    0x38,
    0x20,
    0x00,
    /* L 44 */
    0x08,
    0xF8,
    0x08,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x20,
    0x3F,
    0x20,
    0x20,
    0x20,
    0x20,
    0x30,
    0x00,
    /* M 45 */
    0x08,
    0xF8,
    0xF8,
    0x00,
    0xF8,
    0xF8,
    0x08,
    0x00,
    0x20,
    0x3F,
    0x00,
    0x3F,
    0x00,
    0x3F,
    0x20,
    0x00,
    /* N 46 */
    0x08,
    0xF8,
    0x30,
    0xC0,
    0x00,
    0x08,
    0xF8,
    0x08,
    0x20,
    0x3F,
    0x20,
    0x00,
    0x07,
    0x18,
    0x3F,
    0x00,
    /* O 47 */
    0xE0,
    0x10,
    0x08,
    0x08,
    0x08,
    0x10,
    0xE0,
    0x00,
    0x0F,
    0x10,
    0x20,
    0x20,
    0x20,
    0x10,
    0x0F,
    0x00,
    /* P 48 */
    0x08,
    0xF8,
    0x08,
    0x08,
    0x08,
    0x08,
    0xF0,
    0x00,
    0x20,
    0x3F,
    0x21,
    0x01,
    0x01,
    0x01,
    0x00,
    0x00,
    /* Q 49 */
    0xE0,
    0x10,
    0x08,
    0x08,
    0x08,
    0x10,
    0xE0,
    0x00,
    0x0F,
    0x18,
    0x24,
    0x24,
    0x38,
    0x50,
    0x4F,
    0x00,
    /* R 50 */
    0x08,
    0xF8,
    0x88,
    0x88,
    0x88,
    0x88,
    0x70,
    0x00,
    0x20,
    0x3F,
    0x20,
    0x00,
    0x03,
    0x0C,
    0x30,
    0x20,
    /* S 51 */
    0x00,
    0x70,
    0x88,
    0x08,
    0x08,
    0x08,
    0x38,
    0x00,
    0x00,
    0x38,
    0x20,
    0x21,
    0x21,
    0x22,
    0x1C,
    0x00,
    /* T 52 */
    0x18,
    0x08,
    0x08,
    0xF8,
    0x08,
    0x08,
    0x18,
    0x00,
    0x00,
    0x00,
    0x20,
    0x3F,
    0x20,
    0x00,
    0x00,
    0x00,
    /* U 53 */
    0x08,
    0xF8,
    0x08,
    0x00,
    0x00,
    0x08,
    0xF8,
    0x08,
    0x00,
    0x1F,
    0x20,
    0x20,
    0x20,
    0x20,
    0x1F,
    0x00,
    /* V 54 */
    0x08,
    0x78,
    0x88,
    0x00,
    0x00,
    0xC8,
    0x38,
    0x08,
    0x00,
    0x00,
    0x07,
    0x38,
    0x0E,
    0x01,
    0x00,
    0x00,
    /* W 55 */
    0xF8,
    0x08,
    0x00,
    0xF8,
    0x00,
    0x08,
    0xF8,
    0x00,
    0x03,
    0x3C,
    0x07,
    0x00,
    0x07,
    0x3C,
    0x03,
    0x00,
    /* X 56 */
    0x08,
    0x18,
    0x68,
    0x80,
    0x80,
    0x68,
    0x18,
    0x08,
    0x20,
    0x30,
    0x2C,
    0x03,
    0x03,
    0x2C,
    0x30,
    0x20,
    /* Y 57 */
    0x08,
    0x38,
    0xC8,
    0x00,
    0xC8,
    0x38,
    0x08,
    0x00,
    0x00,
    0x00,
    0x20,
    0x3F,
    0x20,
    0x00,
    0x00,
    0x00,
    /* Z 58 */
    0x10,
    0x08,
    0x08,
    0x08,
    0xC8,
    0x38,
    0x08,
    0x00,
    0x20,
    0x38,
    0x26,
    0x21,
    0x20,
    0x20,
    0x18,
    0x00,
    /* [ 59 */
    0x00,
    0x00,
    0x00,
    0xFE,
    0x02,
    0x02,
    0x02,
    0x00,
    0x00,
    0x00,
    0x00,
    0x7F,
    0x40,
    0x40,
    0x40,
    0x00,
    /* \ 60 */
    0x00,
    0x0C,
    0x30,
    0xC0,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x01,
    0x06,
    0x38,
    0xC0,
    0x00,
    /* ] 61 */
    0x00,
    0x02,
    0x02,
    0x02,
    0xFE,
    0x00,
    0x00,
    0x00,
    0x00,
    0x40,
    0x40,
    0x40,
    0x7F,
    0x00,
    0x00,
    0x00,
    /* ^ 62 */
    0x00,
    0x00,
    0x04,
    0x02,
    0x02,
    0x02,
    0x04,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    /* _ 63 */
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    /* ` 64 */
    0x00,
    0x02,
    0x02,
    0x04,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    /* a 65 */
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x00,
    0x19,
    0x24,
    0x22,
    0x22,
    0x22,
    0x3F,
    0x20,
    /* b 66 */
    0x08,
    0xF8,
    0x00,
    0x80,
    0x80,
    0x00,
    0x00,
    0x00,
    0x00,
    0x3F,
    0x11,
    0x20,
    0x20,
    0x11,
    0x0E,
    0x00,
    /* c 67 */
    0x00,
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x00,
    0x0E,
    0x11,
    0x20,
    0x20,
    0x20,
    0x11,
    0x00,
    /* d 68 */
    0x00,
    0x00,
    0x00,
    0x80,
    0x80,
    0x88,
    0xF8,
    0x00,
    0x00,
    0x0E,
    0x11,
    0x20,
    0x20,
    0x10,
    0x3F,
    0x20,
    /* e 69 */
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x00,
    0x1F,
    0x22,
    0x22,
    0x22,
    0x22,
    0x13,
    0x00,
    /* f 70 */
    0x00,
    0x80,
    0x80,
    0xF0,
    0x88,
    0x88,
    0x88,
    0x18,
    0x00,
    0x20,
    0x20,
    0x3F,
    0x20,
    0x20,
    0x00,
    0x00,
    /* g 71 */
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x6B,
    0x94,
    0x94,
    0x94,
    0x93,
    0x60,
    0x00,
    /* h 72 */
    0x08,
    0xF8,
    0x00,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x20,
    0x3F,
    0x21,
    0x00,
    0x00,
    0x20,
    0x3F,
    0x20,
    /* i 73 */
    0x00,
    0x80,
    0x98,
    0x98,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x20,
    0x20,
    0x3F,
    0x20,
    0x20,
    0x00,
    0x00,
    /* j 74 */
    0x00,
    0x00,
    0x00,
    0x80,
    0x98,
    0x98,
    0x00,
    0x00,
    0x00,
    0xC0,
    0x80,
    0x80,
    0x80,
    0x7F,
    0x00,
    0x00,
    /* k 75 */
    0x08,
    0xF8,
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x00,
    0x20,
    0x3F,
    0x24,
    0x02,
    0x2D,
    0x30,
    0x20,
    0x00,
    /* l 76 */
    0x00,
    0x08,
    0x08,
    0xF8,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x20,
    0x20,
    0x3F,
    0x20,
    0x20,
    0x00,
    0x00,
    /* m 77 */
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    0x00,
    0x20,
    0x3F,
    0x20,
    0x00,
    0x3F,
    0x20,
    0x00,
    0x3F,
    /* n 78 */
    0x80,
    0x80,
    0x00,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x20,
    0x3F,
    0x21,
    0x00,
    0x00,
    0x20,
    0x3F,
    0x20,
    /* o 79 */
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x00,
    0x1F,
    0x20,
    0x20,
    0x20,
    0x20,
    0x1F,
    0x00,
    /* p 80 */
    0x80,
    0x80,
    0x00,
    0x80,
    0x80,
    0x00,
    0x00,
    0x00,
    0x80,
    0xFF,
    0xA1,
    0x20,
    0x20,
    0x11,
    0x0E,
    0x00,
    /* q 81 */
    0x00,
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x0E,
    0x11,
    0x20,
    0x20,
    0xA0,
    0xFF,
    0x80,
    /* r 82 */
    0x80,
    0x80,
    0x80,
    0x00,
    0x80,
    0x80,
    0x80,
    0x00,
    0x20,
    0x20,
    0x3F,
    0x21,
    0x20,
    0x00,
    0x01,
    0x00,
    /* s 83 */
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x33,
    0x24,
    0x24,
    0x24,
    0x24,
    0x19,
    0x00,
    /* t 84 */
    0x00,
    0x80,
    0x80,
    0xE0,
    0x80,
    0x80,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x1F,
    0x20,
    0x20,
    0x00,
    0x00,
    /* u 85 */
    0x80,
    0x80,
    0x00,
    0x00,
    0x00,
    0x80,
    0x80,
    0x00,
    0x00,
    0x1F,
    0x20,
    0x20,
    0x20,
    0x10,
    0x3F,
    0x20,
    /* v 86 */
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x00,
    0x01,
    0x0E,
    0x30,
    0x08,
    0x06,
    0x01,
    0x00,
    /* w 87 */
    0x80,
    0x80,
    0x00,
    0x80,
    0x00,
    0x80,
    0x80,
    0x80,
    0x0F,
    0x30,
    0x0C,
    0x03,
    0x0C,
    0x30,
    0x0F,
    0x00,
    /* x 88 */
    0x00,
    0x80,
    0x80,
    0x00,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x20,
    0x31,
    0x2E,
    0x0E,
    0x31,
    0x20,
    0x00,
    /* y 89 */
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x80,
    0x80,
    0x80,
    0x80,
    0x81,
    0x8E,
    0x70,
    0x18,
    0x06,
    0x01,
    0x00,
    /* z 90 */
    0x00,
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    0x80,
    0x00,
    0x00,
    0x21,
    0x30,
    0x2C,
    0x22,
    0x21,
    0x30,
    0x00,
    /* {  91 */
    0x00,
    0x00,
    0x00,
    0x00,
    0x80,
    0x7C,
    0x02,
    0x02,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x3F,
    0x40,
    0x40,
    /* | 92 */
    0x00,
    0x00,
    0x00,
    0x00,
    0xFF,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0xFF,
    0x00,
    0x00,
    0x00,
    /* } 93 */
    0x00,
    0x02,
    0x02,
    0x7C,
    0x80,
    0x00,
    0x00,
    0x00,
    0x00,
    0x40,
    0x40,
    0x3F,
    0x00,
    0x00,
    0x00,
    0x00,
    /* ~ 94 */
    0x00,
    0x06,
    0x01,
    0x01,
    0x02,
    0x02,
    0x04,
    0x04,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
};

static uint32_t ssd1306_send_data(uint8_t *buff, size_t size)
{
    uint16_t dev_addr = SSD1306_I2C_ADDR;
    i2c_data_t data = {0};
    data.send_buf = buff;
    data.send_len = size;
    uint32_t ret = uapi_i2c_master_write(SSD1306_I2C_IDX, dev_addr, &data);
    if (ret != 0) {
        printf("I2cWrite(%02X) failed, %0X!\n", data.send_buf[1], ret);
        return ret;
    }
    return ret;
}

// 写命令
static uint32_t ssd1306_write_cmd(uint8_t byte)
{
    uint8_t buffer[] = {0x00, byte};
    return ssd1306_send_data(buffer, sizeof(buffer));
}
// 写数据
static uint32_t ssd1306_wite_data(uint8_t byte)
{
    uint8_t buffer[] = {0x40, byte};
    return ssd1306_send_data(buffer, sizeof(buffer));
}

uint32_t ssd1306_init(void)
{
    uint32_t result;
    uint32_t baudrate = SSD1306_I2C_SPEED;
    uint32_t hscode = I2C_MASTER_ADDRESS;
    /* I2C pinmux. */
    uapi_pin_set_mode(I2C_SCL_MASTER_PIN, CONFIG_PIN_MODE);
    uapi_pin_set_mode(I2C_SDA_MASTER_PIN, CONFIG_PIN_MODE);
    uapi_pin_set_pull(I2C_SCL_MASTER_PIN, PIN_PULL_TYPE_UP);
    uapi_pin_set_pull(I2C_SDA_MASTER_PIN, PIN_PULL_TYPE_UP);
    result = uapi_i2c_master_init(1, baudrate, hscode);
    if (result != ERRCODE_SUCC) {
        printf("I2C SSD1306 Init status is 0x%x!!!\r\n", result);
        return result;
    } else {
        printf("I2C SSD1306 Init succ!\r\n");
    }

    osDelay(RESET_TIME);

    ssd1306_write_cmd(0xAE); // display off
    ssd1306_write_cmd(0x20); // Set Memory Addressing Mode
    ssd1306_write_cmd(0x10); // 10,Page Addressing Mode (RESET)
    ssd1306_write_cmd(0xb0); // Set Page Start Address for Page Addressing Mode,0-7
    ssd1306_write_cmd(0xc8); // Set COM Output Scan Direction
    ssd1306_write_cmd(0x00); // ---set low column address
    ssd1306_write_cmd(0x10); // ---set high column address
    ssd1306_write_cmd(0x40); // --set start line address
    ssd1306_write_cmd(0x81); // --set contrast control register
    ssd1306_write_cmd(0xff); //  亮度调节 0x00~0xff
    ssd1306_write_cmd(0xa1); // --set segment re-map 0 to 127
    ssd1306_write_cmd(0xa6); // --set normal display
    ssd1306_write_cmd(0xa8); // --set multiplex ratio(1 to 64)
    ssd1306_write_cmd(0x3F); //
    ssd1306_write_cmd(0xa4); // 0xa4,Output follows RAM content;0xa5,Output ignores RAM content
    ssd1306_write_cmd(0xd3); // -set display offset
    ssd1306_write_cmd(0x00); // -not offset
    ssd1306_write_cmd(0xd5); // --set display clock divide ratio/oscillator frequency
    ssd1306_write_cmd(0xf0); // --set divide ratio
    ssd1306_write_cmd(0xd9); // --set pre-charge period
    ssd1306_write_cmd(0x22); //
    ssd1306_write_cmd(0xda); // --set com pins hardware configuration
    ssd1306_write_cmd(0x12);
    ssd1306_write_cmd(0xdb); // --set vcomh
    ssd1306_write_cmd(0x20); //  0x20,0.77xVcc
    ssd1306_write_cmd(0x8d); // --set DC-DC enable
    ssd1306_write_cmd(0x14); //
    ssd1306_write_cmd(0xaf); // --turn on oled panel
    ssd1306_write_cmd(0xAF); // display ON
    ssd1306_set_position(0, 0);

    return result;
}

void ssd1306_set_position(unsigned char x, unsigned char y) // 设置起始点坐标
{
    uint8_t illegalKeyword = 4; // 右移4位
    ssd1306_write_cmd(0xb0 + y);
    ssd1306_write_cmd(((x & 0xf0) >> illegalKeyword) | 0x10);
    ssd1306_write_cmd((x & 0x0f) | 0x01);
}

void ssd1306_fill(unsigned char fill_data) // 全屏填充
{
    unsigned char m;
    unsigned char n;
    uint8_t numberOfRows = 8;
    uint8_t numberOfColumns = 128;

    for (m = 0; m < numberOfRows; m++) {
        ssd1306_write_cmd(0xb0 + m); // page0-page1
        ssd1306_write_cmd(0x00);     // low column start address
        ssd1306_write_cmd(0x10);     // high column start address
        for (n = 0; n < numberOfColumns; n++) {
            ssd1306_wite_data(fill_data);
        }
    }
}

void ssd1306_cls(void) // 清屏
{
    ssd1306_fill(0x00);
}

/**
 * @brief  唤醒
 * @note  将OLED从休眠中唤醒
 */
void ssd1306_on(void)
{
    ssd1306_write_cmd(0X8D); // 设置电荷泵
    ssd1306_write_cmd(0X14); // 开启电荷泵
    ssd1306_write_cmd(0XAF); // OLED唤醒
}
/**
 * @brief  休眠
 * @note  让OLED休眠 -- 休眠模式下,OLED功耗不到10uA
 */
void ssd1306_off(void)
{
    ssd1306_write_cmd(0X8D); // 设置电荷泵
    ssd1306_write_cmd(0X10); // 关闭电荷泵
    ssd1306_write_cmd(0XAE); // OLED休眠
}

/**
 * @brief  显示字符串
 */
void ssd1306_show_str(uint8_t x, uint8_t y, char *ch, uint8_t text_size)

{
    unsigned char c = 0;
    unsigned char i = 0;
    unsigned char j = 0;
    uint8_t number_of_letter_lattice = 6;
    uint8_t pos_x = x;
    uint8_t pos_y = y;

    switch (text_size) {
        case TEXT_SIZE_8:
            while (ch[j] != '\0') {
                c = ch[j] - ' ';
                if (pos_x > TEXT_8_MAX_ROW_POS) {
                    pos_x = 0;
                    pos_y++;
                }
                ssd1306_set_position(pos_x, pos_y);
                for (i = 0; i < number_of_letter_lattice; i++) {
                    ssd1306_wite_data(F6X8[c][i]);
                }
                pos_x += TEXT_SIZE_8_WIDTH_6;
                j++;
            }
            break;

        case TEXT_SIZE_16:
            pos_y *= OFFSET_2;
            while (ch[j] != '\0') {
                c = ch[j] - ' ';
                if (pos_x > TEXT_16_MAX_ROW_POS) {
                    pos_x = 0;
                    pos_y++;
                }
                ssd1306_set_position(pos_x, pos_y);
                for (i = 0; i < TEXT_SIZE_16_WIDTH_8; i++) {
                    ssd1306_wite_data(F8X16[c * OFFSET_16 + i]);
                }
                ssd1306_set_position(pos_x, pos_y + 1);

                for (i = 0; i < TEXT_SIZE_16_WIDTH_8; i++) {
                    ssd1306_wite_data(F8X16[c * OFFSET_16 + i + OFFSET_8]);
                }
                pos_x += TEXT_SIZE_16_WIDTH_8;
                j++;
            }
            break;

        default:
            break;
    }
}

/**
 * @brief  显示一张图片
 * @note   取模方式： 阳码、列行式、逆向、十六进制数、输出索引格、C51格式
 * @param  xMove: x坐标
 * @param  yMove: y坐标
 * @param  width: 宽
 * @param  height: 高
 */
void ssd1306_draw_bmp(uint8_t xmove, uint8_t ymove, uint8_t width, uint8_t height, uint8_t *bmp)
{
    uint16_t j = 0;
    uint16_t x = 0;
    uint16_t y = 0;
    uint8_t x0 = xmove;
    uint8_t y0 = ymove / 8;
    uint8_t x1 = xmove + width;
    uint8_t y1 = height / 8 + y0;

    for (y = y0; y < y1; y++) {
        ssd1306_set_position(x0, y);
        for (x = x0; x < x1; x++) {
            ssd1306_wite_data(bmp[j]);
            j++;
        }
    }
}